package cn.tedu.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

/**本类用于ArrayList的相关测试*/
public class TestArrayList {
    public static void main(String[] args) {
        /**底层会自动帮我们创建数组用于存放对象，并且数组的默认长度为10*/
        ArrayList <Integer> list = new ArrayList();
        list.add(100);
        list.add(200);
        list.add(300);
        list.add(200);
        list.add(100);
        System.out.println(list);

        //测试常用方法
        list.clear();//清空集合
        System.out.println(list.contains("100"));//false,类型不同
        System.out.println(list.get(0));
        System.out.println(list.indexOf(400));//获取元素第一次出现的索引
        System.out.println(list.lastIndexOf(400));//获取元素最后一次出现的索引

        System.out.println(list.remove(1));//根据下标删除集合中的指定元素
//        System.out.println(list.remove(300));
        /**上面的代码会报错:数组下标越界异常:index 300,size 5
         * 主要是因为List中有两个重载的remove(),如果直接传入数字300
         * 会直接匹配int类型的index索引方法，而不会认为这是一个Integer类型的数据
         * 所以，如果想要根据指定元素删除数据，需要把int类型的数据手动装箱成Integer*/
        System.out.println(list.remove(Integer.valueOf(300)));
        //根据元素删除集合中的指定元素,这里remove方法认为300是下标，是int类型，所以我们需要手动封装int，使其变为Integer
        System.out.println(list);

        System.out.println(list.size());//获取集合的元素个数
        list.set(2,777);//修改下标2的元素，值为777
        System.out.println(list);

        //for循环迭代
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }
        //高效for循环
        for (Integer a:list) {
            System.out.println(a);
        }
        //使用迭代器iterator进行迭代
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        ListIterator<Integer> it2 = list.listIterator();
        while (it2.hasNext()){
            System.out.println(it2.next() );
        }
    }
}
